<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>02自定义指令_对象式</title>
  <script src="../js/vue.js"></script>
</head>
<body>
  <div id="app">
    <h1>{{title}}</h1>
    <input type="text" v-fbind="count">
    <button @click="count++">click</button>
  </div>
  <script>
    /* 
      自定义指令
        1 定义一个v-fbind指令，其功能与v-bind类似但需要实现其在绑定input框的同时自动获取焦点
    */
    new Vue({
      el: '#app',
      data() {
        return {
          title: '自定义指令_对象式',
          count: 1
        }
      },
      directives: {
        /* 
          函数式无法完美的实现v-fbind指令的功能
          fbind(element, binding) {
            element.value = binding.value
            element.focus() // 初次加载时无法获取焦点，模板重新渲染后又能自动获取焦点
          }
        */
        
        /* 对象式 */
        fbind: {
          // 指令成功绑定时执行
          bind(element, binding) {
            element.value = binding.value
          },
          // 被绑定指令的元素已经插入到页面时执行
          inserted(element) {
            element.focus()
          },
          // 指令所在模板重新解析时
          update(element, binding) {
            element.value = binding.value
            element.focus()
          }
        }
      }
      /* 
        函数式更像是对象式的简写形式
        函数式将bind函数和update函数合并成了整体
        对象式则是根据实际开发的具体要求详细的写出了bind，inserted，update三个钩子函数
      */
    })
  </script>
</body>
</html>